/**
 * 数据导出服务
 * 提供多种格式的数据导出功能
 */

class ExportService {
  /**
   * 导出为CSV格式
   * @param {Array} data - 要导出的数据数组
   * @param {Array} headers - 表头配置 [{key: '字段名', title: '显示标题'}]
   * @param {string} filename - 文件名
   */
  exportToCSV(data, headers, filename = 'export.csv') {
    if (!data || data.length === 0) {
      throw new Error('没有数据可导出')
    }

    // 构建CSV头部
    const csvHeaders = headers.map(h => h.title).join(',')
    
    // 构建CSV内容
    const csvContent = data.map(row => {
      return headers.map(header => {
        let value = row[header.key] || ''
        // 处理包含逗号、引号或换行的值
        if (typeof value === 'string' && (value.includes(',') || value.includes('"') || value.includes('\n'))) {
          value = `"${value.replace(/"/g, '""')}"`
        }
        return value
      }).join(',')
    }).join('\n')
    
    // 组合CSV
    const csv = `${csvHeaders}\n${csvContent}`
    
    // 创建Blob并下载
    this.downloadFile(csv, 'text/csv', filename)
  }

  /**
   * 导出为Excel格式（CSV的扩展）
   * @param {Array} data - 要导出的数据数组
   * @param {Array} headers - 表头配置
   * @param {string} filename - 文件名
   */
  exportToExcel(data, headers, filename = 'export.xlsx') {
    // 对于简单场景，可以导出为CSV并更改扩展名
    // 实际项目中可以集成xlsx库实现更复杂的Excel导出
    this.exportToCSV(data, headers, filename.replace('.xlsx', '.csv'))
  }

  /**
   * 导出为JSON格式
   * @param {any} data - 要导出的数据
   * @param {string} filename - 文件名
   */
  exportToJSON(data, filename = 'export.json') {
    const jsonStr = JSON.stringify(data, null, 2)
    this.downloadFile(jsonStr, 'application/json', filename)
  }

  /**
   * 导出为PDF报告（简化版）
   * @param {Object} reportData - 报告数据
   * @param {string} filename - 文件名
   */
  exportToPDF(reportData, filename = 'report.pdf') {
    // 这里是简化实现，实际项目中应使用PDF生成库
    console.log('导出PDF报告', reportData)
    
    // 创建一个简单的HTML报告
    const htmlContent = `
      <!DOCTYPE html>
      <html>
      <head>
        <meta charset="UTF-8">
        <title>${reportData.title || '扫描报告'}</title>
        <style>
          body { font-family: Arial, sans-serif; margin: 20px; }
          h1, h2 { color: #333; }
          .report-header { margin-bottom: 30px; }
          .report-section { margin-bottom: 20px; }
          table { border-collapse: collapse; width: 100%; }
          th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
          th { background-color: #f2f2f2; }
        </style>
      </head>
      <body>
        <div class="report-header">
          <h1>${reportData.title || '漏洞扫描报告'}</h1>
          <p>生成时间: ${new Date().toLocaleString()}</p>
          <p>报告周期: ${reportData.dateRange || '未知'}</p>
        </div>
        
        <div class="report-section">
          <h2>摘要</h2>
          <p>总扫描数: ${reportData.summary?.totalScans || 0}</p>
          <p>发现漏洞: ${reportData.summary?.totalVulnerabilities || 0}</p>
          <p>高危漏洞: ${reportData.summary?.highRiskVulnerabilities || 0}</p>
        </div>
        
        ${reportData.vulnerabilities ? `
        <div class="report-section">
          <h2>漏洞详情</h2>
          <table>
            <thead>
              <tr>
                <th>ID</th>
                <th>名称</th>
                <th>严重程度</th>
                <th>目标</th>
                <th>发现时间</th>
              </tr>
            </thead>
            <tbody>
              ${reportData.vulnerabilities.map(v => `
                <tr>
                  <td>${v.id}</td>
                  <td>${v.name}</td>
                  <td>${v.severity}</td>
                  <td>${v.target}</td>
                  <td>${v.discoveredAt}</td>
                </tr>
              `).join('')}
            </tbody>
          </table>
        </div>
        ` : ''}
      </body>
      </html>
    `
    
    // 创建Blob并下载HTML文件（实际项目中应转换为PDF）
    this.downloadFile(htmlContent, 'text/html', filename.replace('.pdf', '.html'))
    
    // 在控制台提示用户
    console.warn('PDF导出功能在实际项目中需要集成PDF生成库，当前导出为HTML')
  }

  /**
   * 导出图表为图片
   * @param {HTMLElement|string} chartElement - 图表元素或图表ID
   * @param {string} filename - 文件名
   */
  exportChartAsImage(chartElement, filename = 'chart.png') {
    let element
    
    if (typeof chartElement === 'string') {
      element = document.getElementById(chartElement)
    } else {
      element = chartElement
    }
    
    if (!element) {
      throw new Error('图表元素未找到')
    }
    
    // 检查是否是ECharts实例容器
    const chartInstance = window.echarts.getInstanceByDom(element)
    if (chartInstance) {
      // 使用ECharts的导出功能
      const url = chartInstance.getDataURL({
        type: 'png',
        pixelRatio: 2,
        backgroundColor: '#fff'
      })
      this.downloadImage(url, filename)
      return
    }
    
    // 对于普通元素，使用html2canvas（需要引入该库）
    if (window.html2canvas) {
      window.html2canvas(element, {
        backgroundColor: '#fff',
        scale: 2
      }).then(canvas => {
        const url = canvas.toDataURL('image/png')
        this.downloadImage(url, filename)
      })
    } else {
      console.error('html2canvas库未加载，无法导出图表')
      throw new Error('html2canvas库未加载')
    }
  }

  /**
   * 生成分享链接
   * @param {Object} data - 要分享的数据
   * @param {string} baseUrl - 基础URL
   * @returns {string} 分享链接
   */
  generateShareLink(data, baseUrl = window.location.origin) {
    // 将数据序列化为URL参数
    const params = new URLSearchParams()
    
    // 对于复杂数据，使用Base64编码
    if (typeof data === 'object') {
      const encodedData = btoa(JSON.stringify(data))
      params.set('data', encodedData)
    } else {
      params.set('data', String(data))
    }
    
    return `${baseUrl}?${params.toString()}`
  }

  /**
   * 从分享链接解析数据
   * @param {string} url - 分享链接
   * @returns {Object} 解析后的数据
   */
  parseShareLink(url) {
    const urlObj = new URL(url)
    const encodedData = urlObj.searchParams.get('data')
    
    if (!encodedData) {
      return null
    }
    
    try {
      // 尝试Base64解码
      const decodedData = atob(encodedData)
      return JSON.parse(decodedData)
    } catch (error) {
      // 如果解码失败，直接返回原始数据
      return encodedData
    }
  }

  /**
   * 通用文件下载函数
   * @param {string} content - 文件内容
   * @param {string} mimeType - MIME类型
   * @param {string} filename - 文件名
   */
  downloadFile(content, mimeType, filename) {
    const blob = new Blob([content], { type: mimeType })
    const url = URL.createObjectURL(blob)
    
    const link = document.createElement('a')
    link.href = url
    link.download = filename
    document.body.appendChild(link)
    link.click()
    
    // 清理
    setTimeout(() => {
      document.body.removeChild(link)
      URL.revokeObjectURL(url)
    }, 100)
  }

  /**
   * 下载图片
   * @param {string} imageUrl - 图片URL
   * @param {string} filename - 文件名
   */
  downloadImage(imageUrl, filename) {
    const link = document.createElement('a')
    link.href = imageUrl
    link.download = filename
    document.body.appendChild(link)
    link.click()
    
    setTimeout(() => {
      document.body.removeChild(link)
    }, 100)
  }

  /**
   * 导出仪表盘数据
   * @param {Object} dashboardData - 仪表盘数据
   * @param {string} format - 导出格式
   * @param {string} filename - 文件名
   */
  exportDashboard(dashboardData, format = 'pdf', filename = 'dashboard') {
    const exportFormats = {
      csv: () => {
        const headers = [
          { key: 'metric', title: '指标' },
          { key: 'value', title: '数值' },
          { key: 'change', title: '变化' },
          { key: 'period', title: '周期' }
        ]
        const data = []
        
        // 转换仪表盘数据为表格格式
        if (dashboardData.summary) {
          data.push(
            { metric: '总扫描数', value: dashboardData.summary.totalScans, change: dashboardData.summary.scansChange, period: '较昨日' },
            { metric: '发现漏洞', value: dashboardData.summary.totalVulnerabilities, change: dashboardData.summary.vulnsChange, period: '较昨日' },
            { metric: '高危漏洞', value: dashboardData.summary.highRiskVulnerabilities, change: dashboardData.summary.highRiskChange, period: '较昨日' },
            { metric: '安全评分', value: dashboardData.summary.securityScore, change: dashboardData.summary.securityScoreChange, period: '较昨日' }
          )
        }
        
        this.exportToCSV(data, headers, `${filename}.csv`)
      },
      json: () => {
        this.exportToJSON(dashboardData, `${filename}.json`)
      },
      pdf: () => {
        this.exportToPDF(dashboardData, `${filename}.pdf`)
      },
      excel: () => {
        this.exportToExcel(dashboardData, [{ key: 'key', title: '键' }, { key: 'value', title: '值' }], `${filename}.xlsx`)
      }
    }
    
    if (exportFormats[format]) {
      exportFormats[format]()
    } else {
      throw new Error(`不支持的导出格式: ${format}`)
    }
  }
}

// 创建单例实例
const exportService = new ExportService()

export default exportService